import datetime
import numpy as np
'''使用单向RNN来作为活跃度的高层特征抽取方式, 对于活跃度, 早期修复记录影响比较小, 但是近期修复记录影响比较大,
 取最后一个单元的输出作为活跃度的高层特征;
 从当前时间节点往前推3个月, 寻找同当前bug的产品和模块信息相同的开发者活动序列, 取最近的25条;
 这里直接将取出来的开发者序列存成文件了, 这样后来直接读文件就可以了, 算是牺牲代码的简洁和完整性来换取执行速度;
 需要说一点的是, 这块其实是一个原型, 在发现处理速度不尽人意之后, 我按照这个原型重写了一份Java的, 所以本文件其实没有直接用到;'''


# bug_msg_all的数据格式:
# bug_id    assign_to   resolution  dup_id  creation_ts delta_ts    product component

# 需要处理好对应keywords_stemed下所有bug的活跃度, 得到长度为25的开发者活动序列(算重复值么, 算)


delta_time = 3 * 30 * 24 * 60 * 60      # 3个月的秒数, 作为时间戳的差值
# bug_msg_all应该根据delta_ts时间由远到近排列, 方便根据creation_ts往前找

def get_msg_all():
	bug_msg_all = {}
	with open('../data/bugs/bug_msg_all', 'r') as reader:
		for line in reader.readlines():
			temp = line.strip().split('\t')
			# 处理时间成时间戳格式, 原始格式为'1999-03-12 17:33 PST'
			# 观察了下数据集, creation_ts的格式始终为: 1999-03-12 17:33 PST
			# 而delta_ts的格式为: 1999-04-21 11:23:22 PST'
			temp[4] = temp[4].split(' P')[0]
			# if len(temp[4].split(':')) == 2:
			# 	fmt = '%Y-%m-%d %H:%M'
			# elif len(temp[4].split(':')) == 3:
			# 	fmt = '%Y-%m-%d %H:%M:%S'
			temp[4] = datetime.datetime.strptime(temp[4], '%Y-%m-%d %H:%M').timestamp()
			temp[5] = temp[5].split(' P')[0]
			temp[5] = datetime.datetime.strptime(temp[5], '%Y-%m-%d %H:%M:%S').timestamp()
			bug_msg_all[temp[0]] = temp[1:]
	# 将字典按照delta_ts排序出一个列表, 由远及近
	sorted_bugs = sorted(bug_msg_all.items(), key=lambda item: item[1][4])
	return bug_msg_all, sorted_bugs

def write_active_sequence_to_file(sequence, bug_id):
	path = '../data/bugs/active_sequence/'
	with open(path + bug_id, 'w') as writer:
		for name in sequence:
			writer.write(name + '\n')


def get_developer_active_sequence(current_id, bug_msg_all, sorted_bugs):
	# 提取当前bug的creation_ts, product, component;
	# 从得到的creation_ts往前推指定时间段, 比如说前移3个月, 找到这期间所有同product&component的bug报告
	# 取出后25条bug的所有修复者, 组成一个开发者活动序列
	# 写入文件
	current_bug = bug_msg_all[current_id]
	c_product = current_bug[5]
	c_component = current_bug[6]
	c_creation_ts = current_bug[3]
	print(c_creation_ts)
	# 时间顺序上由远到近,也就是delta的时间戳由小到大
	# temp = filter(lambda x: x[1][5] == c_product and x[1][6] == c_component and x[1][4] >= (c_creation_ts-delta_time) and x[1][4] <= c_creation_ts, sorted_bugs)
	# 相当多的数据
	temp = filter(lambda x: x[1][5] == c_product and x[1][6] == c_component  and x[1][4] >= (c_creation_ts-delta_time), sorted_bugs)
	temp = list(temp)
	print(temp)
	return [x[1][0] for x in temp]

if __name__ == '__main__':
	bug_msg_all, sorted_bugs = get_msg_all()
	get_developer_active_sequence('6802', bug_msg_all, sorted_bugs)